package main

import (
	"fmt"
)

func lengthOfLongestSubstring(s string) int {

	// 使用滑动窗口法
	mp := make(map[rune]int) // 记录字符上一次出现的位置
	maxLength := 0
	start := 0

	for end, ch := range s {
		if lastPos, found := mp[ch]; found && lastPos >= start {
			// 如果当前字符在窗口中已经出现过，则移动窗口起始位置
			start = lastPos + 1
		}
		// 更新当前字符的位置
		mp[ch] = end
		// 计算当前窗口长度并更新最大长度
		currentLength := end - start + 1
		if currentLength > maxLength {
			maxLength = currentLength
		}
	}

	return maxLength
}

func main() {
	s := "abba"
	res := lengthOfLongestSubstring(s)
	fmt.Println(res)
}
